package datestructuresjava.shuanglianbiao;

public class DoubleLinkedList {
    private Node head = new Node(0, "");

    public Node getHead() {
        return head;
    }

    /**
     * 在链表的最后添加节点
     *
     * @param node
     */
    public void addLast(Node node) {
        Node temp = head;
        // 找到链表最后
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            temp = temp.getNext();
        }
        // 把新节点连上
        temp.setNext(node);
        node.setPre(temp);
    }

    /**
     * 按编号顺序添加节点
     *
     * @param node
     */
    public void addByOrder(Node node) {
        Node temp = head;
        boolean flag = false;
        // 找到插入位置
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            if (temp.getNext().getNo() > node.getNo()) {
                break;
            }
            if (temp.getNext().getNo() == node.getNo()) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        if (flag) {
            System.out.printf("编号为%d的节点已经存在，无法插入！\n", node.getNo());
        } else {
            if (temp.getNext() != null) {// 说明指针在中间
                temp.getNext().setPre(node);
                node.setNext(temp.getNext());
            }
            // 指针在头节点或者尾节点
            temp.setNext(node);
            node.setPre(temp);
        }
    }

    /**
     * 修改节点
     *
     * @param node
     */
    public void updateByOrder(Node node) {
        if (head.getNext() == null) {
            System.out.println("链表为空，无法修改！");
            return;
        }
        Node temp = head;
        boolean flag = false;
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            if (temp.getNext().getNo() == node.getNo()) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        if (flag) {
            temp.getNext().setName(node.getName());
        } else {
            System.out.printf("未找到编号为%d的节点！\n", node.getNo());
        }
    }

    /**
     * 根据编号删除节点
     *
     * @param no
     */
    public void deleteByOrder(int no) {
        if (head.getNext() == null) {
            System.out.println("链表为空，无法删除！");
            return;
        }
        // 双链表可以自我删除，所以指针定位到自己就可以
        Node temp = head.getNext();
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.getNo() == no) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }
        if (flag) {
            if (temp.getNext() != null) {// 指针在中间，如果指针在最后那就不用执行这步，否则空指针异常
                temp.getNext().setPre(temp.getPre());
            }
            temp.getPre().setNext(temp.getNext());
        } else {
            System.out.printf("未找到编号为%d的节点！\n", no);
        }
    }

    /**
     * 遍历
     */
    public void list() {
        if (head.getNext() == null) {
            System.out.println("链表为空，无法遍历！");
            return;
        }
        Node temp = head.getNext();
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.getNext();
        }
    }

}

